/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef CMN_VERSION_H
#define CMN_VERSION_H

#include <string>
#include <ctime>
#include <cstdint>

// For backward compatibility
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

namespace El {
namespace Common {

/* 版本号定义 */
constexpr int32_t VERSION_MAJOR = 1;
constexpr int32_t VERSION_MINOR = 0;
constexpr int32_t VERSION_PATCH = 0;

/* 产品类型定义 */
enum class ProductType {
    IPC = 0, /* 网络摄像机 */
    NVR,     /* 网络视频录像机 */
    DVR,     /* 数字视频录像机 */
    VTH,     /* 室内机 */
    VTM,     /* 管理机 */
    VTO,     /* 门口机 */
    END,     /* 内窥镜 */
    MIC,     /* 显微镜 */
    MAX
};

/* 产品系列定义 */
enum class ProductSeries {
    UNKNOWN = 0,
    ECONOMIC = 1,     /* 经济型 */
    STANDARD = 2,     /* 标准型 */
    PROFESSIONAL = 3, /* 专业型 */
    ENTERPRISE = 4,   /* 企业型 */
    FLAGSHIP = 5,     /* 旗舰型 */
    /* 6-9预留 */
    MAX = 10
};

/**
 * @brief 版本信息管理类
 */
class VersionManager {
public:
    /**
     * @brief 获取VersionManager单例
     * @return VersionManager单例引用
     */
    static VersionManager &GetInstance();

    /**
     * @brief 获取产品类型字符串
     * @param type 产品类型
     * @return 产品类型字符串
     */
    std::string GetProductTypeStr(ProductType type) const;

    /**
     * @brief 获取产品型号字符串
     * @param type 产品类型
     * @param series 产品系列
     * @param model 型号
     * @return 产品型号字符串
     */
    std::string GetProductModel(ProductType type, int32_t series, int32_t model) const;

    /**
     * @brief 获取基本版本号 (Major.Minor.Patch)
     * @return 基本版本号字符串
     */
    std::string GetVersionBasic() const;

    /**
     * @brief 获取带构建时间和git哈希的完整版本号
     * @return 完整版本号字符串
     */
    std::string GetVersionFull() const;

    /**
     * @brief 获取版本号的各个组成部分
     * @param major 主版本号
     * @param minor 次版本号
     * @param patch 补丁版本号
     */
    void GetVersionComponents(int32_t &major, int32_t &minor, int32_t &patch) const;

    /**
     * @brief 获取产品特性信息
     * @param type 产品类型
     * @param series 产品系列
     * @return 产品特性描述
     */
    std::string GetProductFeatures(ProductType type, uint32_t series) const;

private:
    VersionManager() = default;
    ~VersionManager() = default;
    VersionManager(const VersionManager &) = delete;
    VersionManager &operator=(const VersionManager &) = delete;
};

} // namespace Common
} // namespace El

// Define VERSION after the namespace to use our constants
#define VERSION \
    TOSTRING(El::Common::VERSION_MAJOR) "." TOSTRING(El::Common::VERSION_MINOR) "." TOSTRING(El::Common::VERSION_PATCH)

#endif // CMN_VERSION_H